package main

import (
	"fmt"
	"reflect"
)

// 定义一个示例结构体T
type T struct {
	A string
}

func main() {
	// 基本类型示例
	// 创建一个容量为10的map
	myMap := make(map[string]string, 10)
	// 向map中插入键值对
	myMap["a"] = "b"
	// 获取map的类型
	t := reflect.TypeOf(myMap)
	fmt.Println("type:", t)
	// 获取map的值
	v := reflect.ValueOf(myMap)
	fmt.Println("value:", v)

	// 结构体示例
	// 创建一个结构体实例
	myStruct := T{A: "a"}
	// 获取结构体的值
	v1 := reflect.ValueOf(myStruct)
	// 遍历结构体的字段
	for i := 0; i < v1.NumField(); i++ {
		fmt.Printf("Field %d: %v\n", i, v1.Field(i))
	}
	// 遍历结构体的方法
	for i := 0; i < v1.NumMethod(); i++ {
		// 获取方法名
		fmt.Printf("Method %d: %v\n", i, v1.Method(i))
	}
	// 注意接收者是结构体还是指针
	result := v1.Method(0).Call(nil)
	fmt.Println("result:", result)

	// 获取Example类型的反射Type
	objType := reflect.TypeOf(myStruct)
	// 遍历所有方法
	for i := 0; i < objType.NumMethod(); i++ {
		// 获取方法信息
		method := objType.Method(i)

		// 获取方法名
		methodName := method.Name
		fmt.Println("方法名:", methodName)

		// 获取方法签名
		methodType := method.Type
		fmt.Println("方法签名:", methodType)
	}
}

// 需要注意receive是struct还是指针
func (t T) String() string {
	return t.A + "1"
}
